using EYDIngenieria.ERP.ObjetosDeNegocio.Dominio;
using EYDIngenieria.ERP.ObjetosDeNegocio.Repositorio;

namespace EYDIngenieria.ERP.Aplicacion.Gestion
{
    public class GestionOrdenDeTrabajo
    {
        private RepositorioOrdenDeTrabajo repositorioOrdenDeTrabajo = new RepositorioOrdenDeTrabajo();
        private RepositorioDetalleOrdenDeTrabajo repositorioDetalleOrdenDeTrabajo = new RepositorioDetalleOrdenDeTrabajo();
        private GestionInventario gestionInventario = new GestionInventario();
        private GestionCompraMaterialesOT gestionCompraMaterialesOT = new GestionCompraMaterialesOT();
        private GestionDetalleCompraMaterialesOT gestionDetalleCompraMaterialesOT = new GestionDetalleCompraMaterialesOT();
        private GestionGastosGenerales gestionGastosGenerales = new GestionGastosGenerales();

        public OrdenDeTrabajo GuardarOrdenDeTrabajo(OrdenDeTrabajo ot)
        {
            OrdenDeTrabajo ordenDeTrabajo = new OrdenDeTrabajo();
            ordenDeTrabajo.Fecha = ot.Fecha;
            ordenDeTrabajo.FechaFacturacion = ot.FechaFacturacion;
            ordenDeTrabajo.NumeroOrdenDeTrabajo = ot.NumeroOrdenDeTrabajo;
            ordenDeTrabajo.Cliente = ot.Cliente;
            ordenDeTrabajo.Descripcion = ot.Descripcion;
            ordenDeTrabajo.Estado = ot.Estado;
            ordenDeTrabajo.Monto = ot.Monto;
            repositorioOrdenDeTrabajo.Agregar(ordenDeTrabajo);

            foreach (DetalleOrdenDeTrabajo d in ot.Detalle)
            {
                d.OrdenDeTrabajo = ordenDeTrabajo;
                d.Fecha = ordenDeTrabajo.Fecha;
                d.Saldo = d.Cantidad;
                repositorioDetalleOrdenDeTrabajo.Agregar(d);
                
            }
            
            repositorioOrdenDeTrabajo.Modificar(ordenDeTrabajo);
            return ordenDeTrabajo;
        }

        public OrdenDeTrabajo[] Listar()
        {
            return repositorioOrdenDeTrabajo.Listar();
        }

        public OrdenDeTrabajo Obtener(int id)
        {
            OrdenDeTrabajo ot = repositorioOrdenDeTrabajo.Obtener(id);
            CompraMaterialesOT[] compras = gestionCompraMaterialesOT.Buscar(ot);
            DetalleOrdenDeTrabajo dot;
            foreach (CompraMaterialesOT compra in compras)
            {
                System.Collections.IList d = compra.DetalleCompra;
                foreach (DetalleCompraMaterialesOT dc in d)
                {
                    dot= new DetalleOrdenDeTrabajo();
                    dot.Cantidad = dc.Cantidad;
                    dot.Despachado = dc.Cantidad;
                    dot.Monto = dc.ValorTotal;
                    dot.Fecha = dc.Fecha;
                    dot.OrdenDeTrabajo = ot;
                    dot.Producto = dc.Producto;
                    dot.Saldo = 0;
                    ot.Detalle.Add(dot);
                }
            }
            return ot;
        }

        public OrdenDeTrabajo[] Bucar(int numeroOrdenDeTrabajo)
        {
            return repositorioOrdenDeTrabajo.Buscar(numeroOrdenDeTrabajo);
        }

        public OrdenDeTrabajo[] Listar(EstadoOrdenDeTrabajo e)
        {
            return repositorioOrdenDeTrabajo.Listar(e);
        }

        public OrdenDeTrabajo[] Listar(EstadoOrdenDeTrabajo e,Cliente c)
        {
            return repositorioOrdenDeTrabajo.Listar(e,c);
        }

        public OrdenDeTrabajo[] Listar(Cliente c)
        {
            return repositorioOrdenDeTrabajo.Listar(c);
        }

        public void Modificar(OrdenDeTrabajo ot)
        {
            foreach (DetalleOrdenDeTrabajo d in ot.Detalle)
            {
                d.OrdenDeTrabajo = ot;
                if (d.Id ==0)
                    repositorioDetalleOrdenDeTrabajo.Agregar(d);
                else
                    repositorioDetalleOrdenDeTrabajo.Modificar(d);

            }

            foreach (GastosGenerales compra in ot.GastosGenerales)
            {
                if(compra.Id ==0)
                        gestionGastosGenerales.RegistraCompra(compra);
            }

            

            repositorioOrdenDeTrabajo.Modificar(ot);
        }

        public void Eliminar(OrdenDeTrabajo ot)
        {
           repositorioOrdenDeTrabajo.Eliminar(ot);
        }

        public double ObtenerCosto(OrdenDeTrabajo ot)
        {
            double costo = 0;
            foreach (DetalleOrdenDeTrabajo dot in ot.Detalle)
            {
                costo = costo + dot.Monto;
            }

            foreach (GastosGenerales gasto in ot.GastosGenerales)
            {
                costo = costo + gasto.Monto;
            }
            return costo;
        }
    }
}
